أدوات الشرط


في هذا الفصل سأتطرق الى عبارات التفرع والاختيار IF\else ، unless ، Switch المتوفرة في لغة البرمجة البيرل.



بنية الاختيار IF

تسمى بالبنية وحيدة الاختيار لأنها تسمح باختيار أو تجاهل فعل وحيد

الصيغة :

if ( CONDITION ) {
statement;
}

CONDITION عبارة عن تعبير منطقي أو شرط نتيجة اختباره اما true أو false والجملة statement عبارة عن تعليمة أو اكثر فمثلاً عندما تود اختبار المتغير الداخل اذا كان يساوي 1

if ($var == 1) { print ("This is one.\n"); }

في المثال السابق يتم اختبار الشرط ، اذا كانت النتيجة true ينفذ الجملة print .

قد يأتي شخص اخر ويكتب الجمل السابقة في سطر الواحد (اذا كان فقط يحتوي على سطر واحد في البلوك )

print ("This is one.\n") if ($var == 1);


بنية الاختيار IF\else

تسمى هذة البنية مضاعفة الإختيار لأنها تسمح بالإختيار بين فعلين مختلفين

الصيغة :

if ( CONDITION ) {
statement1;
}
else statement2;

يتم اختبار الشرط فاذا كان true يتم تنفيذ statement1 ويتجاهل statement2 ، اما اذا كانت false يتم تجاهل statement1 وتنفيذ statement2 فعلى سبيل المثال

#!/usr/bin/perl -w 
$var = 1; 
if($var ==1) { 
$var++; 
print $var . "\n"; 
}
else
{
print ("var!=1") ;
}

يبداء بتعريف المتغير var وتخصص له القيمة 1 ، ثم في السطر التالي يختبر المتغير var اذا كان يساوي 1 سيقوم بدخول واجراء العمليات التي في البلوك ، else اذا كانت false غير ذلك



بنية الاختيار IF\else المتداخلة

يتم اختبار عدة شروط وينتهي العمل عند إحداها ،فالقيمة الفارغة اما "" او بالقيمة 0 ثم من خلال المؤثر NOT "!" تقلب الى القيمة 1 للدخول الى البلوك

#!/usr/bin/perl -w 
$i='pass';
if (!$i)                        
{
        print "The string is empty\n";
}
elsif (length($i) == 1)       
{
        print "The string has one character\n";
}
elsif (length($i) == 2)
{
        print "The string has two characters\n";
}
else                            
{
        print "The string has lots of characters\n";
}

elsif حيث يتم اختبار عدة شروط اذا لم يكن النص فارغاًُ ستحاول ويختبر الشرط فيها ،واذا لم يتحقق ينقل الى الاخرى ثم اذا لم يتحقق ينقل الى الاخرى وهكذا حتى يتم اختيار شرط ،الدالة length تقوم بحساب طول النص ( عدد الاحرف )


بنية الاختبار unless

فهي معاكسة الى الحالة if ويمكن ان نستعمل else معها ,لكنها لاتاتي مع elsif

unless (CONDITION) {    statement;    }
او
if (! CONDITION) {    statement;    }

العامل <=> يعيد -1 اذا الايسر اصغر من الايمن ، ويعيد 0 اذا كان متساوين ، ويعيد +1 اذا كانت قيمة الايسر اكبر من الايمن

SWITCH: foreach ($a <=> $b) {
$_ == -1 and do {print "Less"; last;};
$_ == +1 and do {print "More"; last;};
print "Equal";
}

اما switch ليست متؤفره في البيرل (هي مالؤفه في السي ) ، يمكنك عملها باستخدام طرق اخرى :

مثال عن طريق if

#!/usr/bin/perl
$value=<STDIN>;
if ($value == 1) 
{
print "First Place";
} 
elsif ($value == 2) 
{
print "Second Place";
} 
elsif ($value == 3) 
{
print "Third Place";
} 
else {
print "Try Again";
}

اوعن طريق label

#!/usr/bin/perl
$value=<STDIN>
SWITCH: {
if ($value == 1) { print "First Place" };
if ($value == 2) { print "Second Place" };
if ($value == 3) { print "Third Place" };
if ($value > 3) { print "Try Again" };
}

أو

#!/usr/bin/perl
$value=<STDIN>
SWITCH: {
$value == 1 and print "First Place";
$value == 2 and print "Second Place";
$value == 3 and print "Third Place";
$value > 3 and print "Try Again";
}

و last كا break في السي وهي تؤمن لخروج من بلوك SWITCH (فالـ Next و lastو redoتسعمل للسيطرة على التكرارات سوف تناقش فيما بعد )

#!/usr/bin/perl
$value=<STDIN>
SWITCH: {
$value == 1 and print ("First Place"), last;
$value == 2 and print ("Second Place"), last;
$value == 3 and print ("Third Place"), last;
print "Try Again"; # default case
}

لاتستعمل مع النصوص بهذا الشكل

#!/usr/bin/perl
$value=<STDIN>
SWITCH: {
$value eq "1" and print ("First Place"), last;
$value eq "2" and print ("Second Place"), last;
$value eq "3" and print ("Third Place"), last;
print "Try Again";
}

فهي تستعمل مع التعبيرات المنتظمة

#!/usr/bin/perl
$value=<STDIN>
SWITCH: {
$value =~/^1$/ and print("First Place"), last;
$value =~/^2$/ and print("Second Place"), last;
$value =~/^3$/ and print("Third Place"), last;
print "Try Again";
}

أو عن طريق الموديل Switch

#!/usr/bin/perl
use Switch;
$value=<STDIN>
chomp $value;
switch ($value) {
case 1 { print "First Place" ;next}
case 2 { print "Second Place";last }
case 3 { print "Third Place";}
else { print "...Also Ran"; }
}